/* -*-c++-*- */
/* osgGIS - GIS Library for OpenSceneGraph
 * Copyright 2007-2008 Glenn Waldron and Pelican Ventures, Inc.
 * http://osggis.org
 *
 * osgGIS is free software; you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 */

#ifndef _OSGGIS_OGR_FACTORY_H_
#define _OSGGIS_OGR_FACTORY_H_

#include <osgGIS/Common>
#include <osgGIS/SpatialReferenceFactory>

namespace osgGIS
{
    /* (internal)
     *
     * Spatial reference factory implementation that creates OGR-based
     * SRS objects.
     */
    class OGR_SpatialReferenceFactory : public SpatialReferenceFactory
    {
    public:
        OGR_SpatialReferenceFactory();

        virtual ~OGR_SpatialReferenceFactory();

        SpatialReference* createWGS84();

        SpatialReference* createCEA();
        
        SpatialReference* createSRSfromWKT( 
            const std::string& wkt );

        SpatialReference* createSRSfromWKT(
            const std::string&  wkt,
            const osg::Matrixd& reference_frame );
        
        SpatialReference* createSRSfromESRI( 
            const std::string& esri );
        
        SpatialReference* createSRSfromESRI( 
            const std::string& esri,
            const osg::Matrixd& reference_frame );

        SpatialReference* createSRSfromWKTfile(
            const std::string& abs_path );

        SpatialReference* createSRSfromPROJ4(
            const std::string& proj4_def );

        SpatialReference* createSRSfromTerrain(
            osg::Node* node );

        SpatialReference* createGeocentricSRS();
        
        SpatialReference* createGeocentricSRS( 
            const SpatialReference* basis );

        SpatialReference* createGeocentricSRS(
            const SpatialReference* basis,
            const osg::Matrixd& reference_frame );

        SpatialReference* createGeocentricSRS(
            const osg::CoordinateSystemNode* cs_node );

        SpatialReference* validateSRS(
            SpatialReference* srs_to_validate );

    private:
        osg::ref_ptr<SpatialReference> wgs84;
        osg::ref_ptr<SpatialReference> cea;
    };
}


#endif // _OSGGIS_OGR_FACTORY_H_
